package main

import (
	"errors"
	"fmt"
)

func main() {
	//第六章：go语言的错误处理
	//学习go语言的错误处理
	err := test()
	if err != nil {
		fmt.Println("自定义错误：", err)
		panic(err)
		//Q:为什么这里要使用panic
		//A:因为这里的err是自定义的错误，不是系统的错误
		//A:所以需要使用panic来抛出异常
		//Q:panic是啥意思
		//A:panic是go语言的一个内置函数，可以中断原有的控制流程
		//A:进入一个令人恐慌的流程
		//A:当函数F调用panic，函数F的执行被中断
		//A:但是F中的延迟函数会正常执行
		//A:之后F返回到调用它的地方
		//A:在调用的地方，F的行为就像调用了panic
		//A:这一过程继续向上，直到发生panic的goroutine中所有被延迟的函数执行完毕
		//A:然后程序崩溃
		//Q:panic和os.Exit有什么区别
		//A:os.Exit退出时不会调用defer注册的函数
		//A:os.Exit退出时不输出当前调用栈信息
		//A:panic退出时会调用defer注册的函数
		//A:panic退出时会输出当前调用栈信息
		//Q:panic和os.Exit应该怎么选择
		//A:程序中遇到不可恢复的错误时，应该使用panic
		//A:程序中遇到可以恢复的错误时，应该使用error
		//A:程序中遇到需要立即终止程序的时候，应该使用os.Exit
	} else {
		fmt.Println("没有错误")
	}
	fmt.Println("上面的代码执行成功")
	fmt.Println("正常下面的代码")
}

func test() (err error) {
	num1 := 10
	num2 := 0
	if num2 == 0 {
		//手动抛出异常
		return errors.New("除数不能为0哦~~")
	} else {
		res := num1 / num2
		fmt.Println(res)
		return nil
	}
}
